package org.dromara.comm_lhz.service.impl;

import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.dromara.comm_lhz.entity.AsCouponEntity;
import org.dromara.comm_lhz.entity.dto.AsCouponDto;
import org.dromara.comm_lhz.mapper.AsCouponHMapper;
import org.dromara.comm_lhz.service.AsCouponHService;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.Date;

@Service
public class AsCouponHServiceImpl extends ServiceImpl<AsCouponHMapper, AsCouponEntity> implements AsCouponHService {

    // 线程池任务调度器，用于调度优惠券状态更新任务
    private final ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();

    public AsCouponHServiceImpl() {
        // 初始化任务调度器
        taskScheduler.initialize();
    }

    /**
     * 根据条件获取优惠券列表
     *
     * @param asCouponDto 优惠券查询条件封装对象
     * @return 分页后的优惠券列表
     */
    @Override
    public Page<AsCouponEntity> getCoupon(AsCouponDto asCouponDto) {
        LambdaQueryWrapper<AsCouponEntity> queryWrapper = new LambdaQueryWrapper<>();

        // 根据优惠券名称进行模糊查询
        if (StringUtils.hasText(asCouponDto.getCouponName())) {
            queryWrapper.like(AsCouponEntity::getCouponName, asCouponDto.getCouponName());
        }
        // 只查询状态为未使用的优惠券
        queryWrapper.eq(AsCouponEntity::getState, 0);

        // 实现分页功能
        Page<AsCouponEntity> page = new Page<>(asCouponDto.getPageNum(), asCouponDto.getPageSize());
        return this.page(page, queryWrapper);
    }

    /**
     * 添加优惠券
     *
     * @param asCouponEntity 优惠券实体对象，包含要保存的优惠券信息
     */
    @Override
    public void addCoupon(AsCouponEntity asCouponEntity) {
        // 设置优惠券的创建时间
        asCouponEntity.setCreateTime(new Date());
        // 保存优惠券信息
        this.save(asCouponEntity);

        // 设置定时任务，三天后将优惠券状态更新为过期
        scheduleCouponExpiration(asCouponEntity.getId(), 3 * 24 * 60 * 60 * 1000L); // 3天的毫秒数
    }

    /**
     * 调度优惠券过期任务
     *
     * @param couponId 优惠券ID
     * @param delay    延迟时间，单位为毫秒
     */
    private void scheduleCouponExpiration(Integer couponId, long delay) {
        // 安排指定时间后执行优惠券状态更新任务
        taskScheduler.schedule(() -> updateCouponStatus(couponId), new Date(System.currentTimeMillis() + delay));
    }

    /**
     * 更新优惠券状态为过期
     *
     * @param couponId 优惠券ID
     */
    private void updateCouponStatus(Integer couponId) {
        AsCouponEntity coupon = this.getById(couponId);
        // 检查优惠券是否存在且状态为未使用
        if (ObjectUtil.isNotEmpty(coupon) && coupon.getState() == 0) {
            // 将优惠券状态设置为过期
            coupon.setState(2);
            this.updateById(coupon);
        }
    }

}
